package com.fhz.coroutinestest

import kotlinx.coroutines.*
import java.io.FileInputStream
import kotlin.system.measureTimeMillis

/**
 * 时间:2023/3/30
 * @author Mr.Feng
 * 简述: 协程测试
 * 1,协程是什么?
 *  一种轻量级(不过多占用系统资源)线程,但是不是线程.
 *
 * 2,协程的作用?
 * 简化异步代码代码,实现同步效果, 代码的阅读性更好.
 *
 * 3,创建一个协程
 *  3.1 launch可以启动一个协程 返回job ,没有返回值
 *  3.2 async也可以启动一个协程 返回deffered对象 有返回值.
 *
 * 4,runBlocking 可以创建一个协程的作用域,但不用于实际开发中,多用于测试.
 *
 * 5,协程的取消. 借着的是job对想,可以取消协程
 *  join() 插队,必须等待插队协程执行完,才能继续执行
 *  cancel() 取消当前协程
 *
 * 6,挂起函数 -> 必须运行在协程作用域中.
 * suspend 告诉调用者,我是一个耗时操作,用我的请小心.
 *
 * 7,Dispatchers 四种协程模式
 *
 *

 *
 */
fun main() = runBlocking {
    // 开启一个协程,并不阻塞主线程.
    val time = measureTimeMillis {
        val one = async{doSomethingUsefulOne()}
        val two = async {doSomethingUsefulTwo()}
        println("The answer is ${one.await() + two.await()}")
    }
    println("Completed in $time ms")

}

suspend fun doSomethingUsefulOne(): Int {
    delay(1000L) // 假设我们在这里做了一些有用的事
    return 1
}
suspend fun doSomethingUsefulTwo(): Int {
    delay(1000L) // 假设我们在这里也做了一些有用的事
    return 1
}